package entidades;

public class ListaDupla extends Controlador{
    
    //verificaElemento
    //tamanhoEstrutura
    
    private void iniciaListaDupla(Object elemento){
        if(tamanho == 0){
            primeira = new Celula();
            ultima = primeira;
            Celula novaCelula = new Celula();
            novaCelula.setElemento(elemento);
            novaCelula.setProximo(null);
            novaCelula.setAnterior(primeira);
            primeira.setProximo(novaCelula);
            primeira.setAnterior(null);
            ultima = novaCelula;
            tamanho++;            
        }
    }
    
    public void insereFimListaDupla(Object elemento){
        if(tamanho == 0){
            iniciaListaDupla(elemento);
        }else{
            Celula novaCelula = new Celula();
            novaCelula.setElemento(elemento);
            novaCelula.setProximo(null);
            novaCelula.setAnterior(ultima);
            ultima.setProximo(novaCelula);
            ultima = novaCelula;
            tamanho++;
        }
    }
    
    public void insereComecoListaDupla(Object elemento){
        if(tamanho == 0){
            iniciaListaDupla(elemento);
        }else{
            Celula novaCelula = new Celula();
            novaCelula.setElemento(elemento);
            novaCelula.setProximo(primeira.getProximo());            
            novaCelula.setAnterior(primeira);
            primeira.setProximo(novaCelula);
            primeira.getProximo().setAnterior(novaCelula);
            tamanho++;
        }        
    }
    
    public void inserePosicaoListaDupla(int posicao, Object elemento){
        if(tamanho == 0){
            System.out.println("estrutura vazia, inserir no começo.");
            insereComecoListaDupla(elemento);
        }else if(posicao == 1 || posicao == 0){
            insereComecoListaDupla(elemento);
        }else if(posicao > tamanho){
            insereFimListaDupla(elemento);
        }else{
            Celula auxiliar = primeira;
            for (int i = 0; i < posicao - 1; i++) {
                    auxiliar = auxiliar.getProximo();
            }
            Celula novaCelula = new Celula();
            novaCelula.setElemento(elemento);
            novaCelula.setProximo(auxiliar.getProximo());
            novaCelula.setAnterior(auxiliar);
            auxiliar.setProximo(novaCelula);
            auxiliar.getProximo().setAnterior(novaCelula);            
            tamanho++;            
        }
    }
    
    public void removeElementoPosicaoListaDupla(int posicao){
        Celula remove = primeira;
        if(posicao > tamanho){
                System.out.println("Posição nao existe.");
            }else{
            for (int i = 1; i <= tamanho; i++) {
            remove = remove.getProximo();
            if(posicao == i){
                if(remove == ultima){
                    remove.getAnterior().setProximo(null);
                    ultima = remove.getAnterior();
                    tamanho--;
                }else if(posicao == i){
                    remove.getAnterior().setProximo(remove.getProximo());
                    remove.getProximo().setAnterior(remove.getAnterior());
                    tamanho--;
                }
            }
        }
            System.out.println("Ultima: "+ultima.getElemento());
        }
    }
    
    public void ConsultaElementoAdjecentesListaDupla(int posicao){
        Celula atual = primeira;
        if(posicao > tamanho){
            System.out.println("Posição não existe.");
        }
        for (int i = 1; i <= tamanho; i++) {
            atual = atual.getProximo();
            if(posicao == i){
                if(atual == ultima){
                    System.out.println("Anterior: " + atual.getAnterior().getElemento() + " Atual: " + atual.getElemento());
                }else{
                    System.out.println("Anterior: " + atual.getAnterior().getElemento() + 
                            " Atual: " + atual.getElemento() + 
                            " Posterior: " + atual.getProximo().getElemento());
                }
                
            }
        }
    }
}//ListaDupla
